<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //原型继承
        // function Animal() {
        //     this.sex = 'man'
        //     this.eat = function () {
        //         console.log('eat')
        //     }
        // }
        // Animal.prototype = { aaa: 100 }
        // function Humen(name, age) {
        //     this.name = name
        //     this.age = age
        // }
        // Humen.prototype = new Animal()  // {sex : "man"}
        // var xiaoming = new Humen('小明', 22) //对象
        // var xiaohong = new Humen('小红', 20)
        // xiaohong.__proto__.sex = 'woman'

        // console.log(xiaohong)
        // console.log(xiaoming)
        //优点：1.可以继承原型上所有的属性  2.可以继承原型的原型.....上的属性根方法
        //缺点：一个实例改变其原型上的属性，其他的所有实例都会跟着更改

        //构造函数继承
        // function Animal() {
        //     this.sex = 'man'
        //     this.eat = function () {
        //         console.log('eat')
        //     }
        // }
        // Animal.prototype = { aaa: 100 }
        // function Humen(name, age) {
        //     //{sex : 'man' ,eat : fun , name , age}
        //     this.name = name
        //     this.age = age
        //     Animal.call(this)  //参数1:
        // }
        // var xiaoming = new Humen('小明', 22) //对象
        // var xiaohong = new Humen('小红', 20)

        // // console.log(xiaoming, xiaohong)
        // xiaohong.sex = 'woman'
        // console.log(xiaoming)

        //1.优点：一个实例修改原型的属性，不会影响其他的实例
        //2.缺点：获取不到原型的原型....上的属性和方法


        //组合继承
        function Animal() {
            this.sex = 'man'
            this.eat = function () {
                console.log('eat')
            }
        }
        Animal.prototype = { aaa: 100 }
        var obj = Object.create(Animal.prototype)
        function Humen(name, age) {
            this.name = name
            this.age = age
            Animal.call(this)
        }
        Humen.prototype = new Animal()

        //寄生组合继承
        function Animal() {
            this.sex = 'man'
            this.eat = function () {
                console.log('eat')
            }
        }
        Animal.prototype = { aaa: 100 }
        var obj = Object.create(Animal.prototype)
        function Humen(name, age) {
            this.name = name
            this.age = age
            Animal.call(this)
        }
        Humen.prototype = obj

        //特性：1.一个实例改变原型上的属性，其他实例不会跟着改变
        //特性：2.所有的实例都能继承原型的原型.....上的所有属性
        //特性：3.不会将Aniaml执行第二次，减少了开销







    </script>
</body>

</html>